home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / ici / ici.cpi / mkstruct.c < prev    next >
C/C++ Source or Header  |  1994-10-27  |  2KB  |  91 lines

  1. #include "object.h"
  2. #include <varargs.h>
  3.  
  4. /*
  5.  * mkstruct(struct, "i st_mode i st_ino i st_dev", mode, ino, dev)
  6.  */
  7. struct_t *
  8. mkstruct(va_alist)
  9. va_dcl
  10. {
  11.     va_list        va;
  12.     struct_t        *s;    /* Arg 1. */
  13.     register char    *fmt;    /* Arg 2. */
  14.     register char    *p;
  15.     register object_t    *o;
  16.     register struct_t    *d;
  17.     string_t        *n;
  18.  
  19.     va_start(va);
  20.     s = va_arg(va, struct_t *);
  21.     fmt = va_arg(va, char *);
  22.     if ((d = s) == NULL)
  23.     {
  24.     if ((d = new_struct()) == NULL)
  25.         return NULL;
  26.     }
  27.     n = NULL;
  28.     o = NULL;
  29.     while (*fmt != '\0')
  30.     {
  31.     for (p = &fmt[2]; *p != ' ' && *p != '\0'; ++p)
  32.         ;
  33.     switch (*fmt)
  34.     {
  35.     case 'i':
  36.         if ((o = objof(new_int((long)va_arg(va, int)))) == NULL)
  37.         goto fail;
  38.         break;
  39.  
  40.     case 'l':
  41.         if ((o = objof(new_int(va_arg(va, long)))) == NULL)
  42.         goto fail;
  43.         break;
  44.  
  45.     case 'f':
  46.         if ((o = objof(new_float(va_arg(va, double)))) == NULL)
  47.         goto fail;
  48.         break;
  49.  
  50.     case 's':
  51.         if ((o = objof(new_cname(va_arg(va, char *)))) == NULL)
  52.         goto fail;
  53.         break;
  54.  
  55.     case 'o':
  56.         if ((o = va_arg(va, object_t *)) == NULL)
  57.         {
  58.         o = objof(&o_null);
  59.         got(o);
  60.         }
  61.         break;
  62.  
  63.     default:
  64.         error = "illegal structure fill";
  65.         goto fail;
  66.     }
  67.     fmt += 2;
  68.     if ((n = new_name(fmt, p - fmt)) == NULL)
  69.         goto fail;
  70.     if (assign(objof(d), objof(n), o))
  71.         goto fail;
  72.     loose(o);
  73.     loose(n);
  74.     n = NULL;
  75.     o = NULL;
  76.     if (*(fmt = p) == '\0')
  77.         break;
  78.     ++fmt;
  79.     }
  80.     return d;
  81.  
  82. fail:
  83.     if (o != NULL && o != objof(&o_null))
  84.     loose(o);
  85.     if (n != NULL)
  86.     freeo(n);
  87.     if (s == NULL)
  88.     freeo(d);
  89.     return NULL;
  90. }
  91.